package com.handinfo.game;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;

import com.handinfo.engine.*;
import com.handinfo.util.Tools;
import com.handinfo.util.UIUtil;

/**
 * <p>
 * Title: MMO1
 * </p>
 * 
 * <p>
 * Description: MMO1
 * </p>
 * 
 * <p>
 * Copyright: Copyright (c) 2009
 * </p>
 * 
 * <p>
 * Company: HandInfo
 * </p>
 * 
 * @author Xia Mingwei
 * @version 1.0
 */
public class GameScript extends AbstractGameScript
{
	public GameScene m_scene;

	public GameScript(AbstractGameScene scene)
	{
		super(scene);
		m_scene = (GameScene) scene;
	}

	// //////////////////////////////////////////////////////////////////////////
	// // FUNCTION相关

	/**
	 * 获得功能值
	 * 
	 * @param functionId
	 * 功能ID
	 * @return
	 */
	public int getFunctionValue(int functionId)
	{
		// System.out.println("functionId: " + functionId);
		switch (functionId) {
			case FUN_RUN_FRAME: {
				return m_scene.m_frameCount;
			}
			case FUN_EVENT_ACTORCLASS: {
				return m_eventActorClass;
			}
			case FUN_EVENT_ACTORID: {
				return m_eventActorId;
			}
			case FUN_EVENT_ACTORACTION: {
				return m_eventActorAction;
			}
			case FUN_COLLIDE_ACTORCLASS: {
				return m_collideActorClass;
			}
			case FUN_COLLIDE_ACTORID: {
				return m_collideActorId;
			}
			case FUN_COLLIDE_ACTORACTION: {
				return m_collideActorAction;
			}
			case FUN_ACTIVATE_ACTORCLASS: {
				return m_activateActorClass;
			}
			case FUN_ACTIVATE_ACTORID: {
				return m_activateActorId;
			}
			case FUN_ACTIVATE_ACTORACTION: {
				return m_activateActorAction;
			}
			case FUN_UP_PRESSED:
			case FUN_UPRIGHT_PRESSED:
			case FUN_RIGHT_PRESSED:
			case FUN_DOWNRIGHT_PRESSED:
			case FUN_DOWN_PRESSED:
			case FUN_DOWNLEFT_PRESSED:
			case FUN_LEFT_PRESSED:
			case FUN_UPLEFT_PRESSED:
			case FUN_CONFIRM_PRESSED:
			case FUN_POUND_PRESSED:
			case FUN_ZERO_PRESSED:
			case FUN_STAR_PRESSED:
			case FUN_LEFTSOFT_PRESSED:
			case FUN_RIGHTSOFT_PRESSED: {
				int keyPressed = 1 << (functionId - FUN_UP_PRESSED);
				if (AbstractGameScreen.haveKeyPressed(keyPressed)) {
					return 1;
				}
				else {
					return 0;
				}
			}
			case FUN_SCREEN_WIDTH: {
				return AbstractGameScreen.SCREEN_WIDTH;
			}
			case FUN_SCREEN_HEIGHT: {
				return AbstractGameScreen.SCREEN_HEIGHT;
			}
			// 自定义代码
		}
		return functionId;
	}

	// // FUNCTION相关
	// //////////////////////////////////////////////////////////////////////////

	// //////////////////////////////////////////////////////////////////////////
	// // EVENT相关

	public String getEventName(int eventId)
	{
		switch (eventId) {
			case EVENT_SCENE_INIT: // 场景初始化
				return "SCENE_INIT";
			case EVENT_SCENE_LOADED: // 场景载入
				return "SCENE_LOADED";
			case EVENT_SCENE_UNLOADED: // 场景卸载
				return "SCENE_UNLOADED";
			case EVENT_TICK_EVENT: // 帧事件
				return "TICK_EVENT";
			case EVENT_COLLIDE_PLAYER: // 元件与玩家元件碰撞
				return "COLLIDE_PLAYER";
			case EVENT_ACTIVATE_PLAYER: // 元件与玩家元件激活
				return "ACTIVATE_PLAYER";
			case EVENT_COLLIDE_ACTOR: // 元件碰撞
				return "COLLIDE_ACTOR";
			case EVENT_ACTIVATE_ACTOR: // 元件激活
				return "ACTIVATE_ACTOR";
			case EVENT_KEY_PRESSED: // 按键事件
				return "KEY_PRESSED";
			case EVENT_ACTOR_ACTIONOVER: // 元件执行动作结束
				return "ACTOR_ACTIONOVER";
			case EVENT_ACTOR_HIDE: // 元件隐藏事件
				return "ACTOR_HIDE";
			case EVENT_ACTOR_DELETE: // 元件销毁事件
				return "ACTOR_DELETE";
			default:
				return "unknow event";
		}
	}

	// // EVENT相关
	// //////////////////////////////////////////////////////////////////////////

	/**
	 * 获得参数最终值的方法 参数类型会对给定值进行处理返回的才是最终值
	 * 
	 * @param type
	 * 参数类型
	 * @param result
	 * 参数的给定值
	 * @return
	 */
	public int getParameterValue(int type, int result)
	{
		switch (type) {
			case TYPE_VARIABLE: {
				return s_vars[result];
			}
			case TYPE_FUNCTION: {
				return getFunctionValue(result);
			}
		}
		return result;
	}

	// //////////////////////////////////////////////////////////////////////////
	// // ACTION相关

	public String getActionName(int actionId)
	{
		switch (actionId) {
			case ACTION_DO_NOTHING:
				return "DO NOTHING";
			case ACTION_SET_VARIABLE:
				return "SET VAR";
			case ACTION_RANDOM_VARIABLE:
				return "RANDOM VAR";
			case ACTION_COMPUTE_VARIABLE:
				return "COMPUTE VAR";
			case ACTION_IF_THEN_ELSE:
				return "IF ELSE";
			case ACTION_SET_VIEWACTOR:
				return "SET VIEWACTOR";
			case ACTION_SET_PLAYERACTOR:
				return "SET PLAYERACTOR";
			case ACTION_SET_ACTOR:
				return "SET ACTOR";
			case ACTION_SET_ACTORACTION:
				return "SET ACTORACTION";
			case ACTION_GET_ACTORACTION:
				return "GET ACTORACTION";
			case ACTION_SET_ACTORPOSITION:
				return "SET ACTORPOSITION";
			case ACTION_GET_ACTORPOSITION:
				return "GET ACTORPOSITION";
			case ACTION_SET_ACTORFLAG:
				return "SET ACTORFLAG";
			case ACTION_GET_ACTORFLAG:
				return "GET ACTORFLAG";
			case ACTION_SET_ACTORPARAMETER:
				return "SET_ACTORPARAMETER";
			case ACTION_GET_ACTORPARAMETER:
				return "GET_ACTORPARAMETER";
			case ACTION_SET_ACTORDEST:
				return "SET_ACTORDEST";
			case ACTION_MOVE_ACTOR:
				return "MOVE_ACTOR";
			case ACTION_PLAY_ACTORACTION:
				return "PLAY_ACTORACTION";
			case ACTION_DELETE_ACTOR:
				return "DELETE_ACTOR";
			case ACTION_PLAY_TRAILER:
				return "PLAY_TRAILER";
			case ACTION_SHOW_DIALOG:
				return "SHOW_DIALOG";
			case ACTION_SHOW_MESSAGE:
				return "SHOW_MESSAGE";
			case ACTION_FLASH_SCREEN:
				return "FLASH_SCREEN";
			case ACTION_SCREEN_FADEIN:
				return "SCREEN_FADEIN";
			case ACTION_SCREEN_FADEOUT:
				return "SCREEN_FADEOUT";
			case ACTION_SCREEN_SHAKE:
				return "SCREEN_SHAKE";
			case ACTION_SET_EFFECT_ON:
				return "SET_EFFECT_ON";
			case ACTION_SET_EFFECT_OFF:
				return "SET_EFFECT_OFF";
			case ACTION_BREAK_TRIGGER:
				return "BREAK_TRIGGER";
				// case ACTION_SHOW_CONFIRM:
				// return "SHOW_CONFIRM";
			case ACTION_SET_SOUND:
				return "SET_SOUND";
			case ACTION_PLAY_SOUND:
				return "PLAY_SOUND";
				// case ACTION_SEND_SMS:
				// return "SEND_SMS";
				// case ACTION_NEW_GAME:
				// return "NEW_GAME";
				// case ACTION_LOAD_GAME:
				// return "LOAD_GAME";
				// case ACTION_SHOW_HELP:
				// return "SHOW_HELP";
				// case ACTION_SHOW_ABOUT:
				// return "SHOW_ABOUT";
				// case ACTION_QUIT_GAME:
				// return "QUIT_GAME";
				// case ACTION_SAVE_GAME:
				// return "SAVE_GAME";
				// case ACTION_GAME_OVER:
				// return "GAME_OVER";
				// case ACTION_SHOW_SUBTITLE:
				// return "ACTION_SHOW_SUBTITLE";
//			case ACTION_MOVE_VIEW:
//				return "MOVE_VIEW";
//			case ACTION_WAIT_KEY:
//				return "WAIT_KEY";
//			case ACTION_SET_SCENE_STATE_ON:
//				return "SET_SCENE_STATE_ON";
//			case ACTION_SET_SCENE_STATE_OFF:
//				return "SET_SCENE_STATE_OFF";
//			case ACTION_LOCK_MOVEAREA:
//				return "ACTION_LOCK_MOVEAREA";
//			case ACTION_UNLOCK_MOVEAREA:
//				return "ACTION_UNLOCK_MOVEAREA";
//			case ACTION_OPEN_UI:
//				return "ACTION_OPEN_UI";
//			case ACTION_CLOSE_UI:
//				return "ACTION_CLOSE_UI";
			default:
				return "unknow event action";
		}
	}

	public int m_preActionId = -1;

	/**
	 * 执行动作，动作在工具层面定义，但具体执行每款游戏需要单独实现 getShort()来获得参数类型或参数值
	 * getParameter()来直接获得参数值，将获得参数类型和通过类型解析值合二为一
	 * getCondition()来获得条件参数的结果，递归调用executeAction()方法来执行动作参数
	 * 调用skip()来跳过一段触发器数据，调用skipAction()来跳过动作参数
	 * 
	 * @param actionId
	 * 动作ID
	 */
	public void executeAction(int actionId)
	{
		if (actionId != m_preActionId) {
			m_preActionId = actionId;
			if (Tools.DEBUG) {
				System.out.println("executeAction: " + getActionName(actionId));
			}
		}
		int type, value;
		boolean cond;
		switch (actionId) {
		// 内置动作 - 游戏暂停一段时间
			case ACTION_DO_NOTHING: {
				// 获得暂停帧数
				value = getParameter();
				if (value == 0) {
					return;
				}
				GameManager.waitAnyTime(value);
				break;
			}
			// 内置动作 - 设置变量值
			case ACTION_SET_VARIABLE: {
				// 获得第一个参数的类型和参数值
				type = getShort();
				value = getShort();
				if (type == TYPE_VARIABLE) { // 第一个参数必须为变量类型
					s_vars[value] = getParameter();
				}
				else { // 如果第一个参数不是变量类型则不进行变量值设置，但需要跳过第二个参数
					skip(2); // 必须跳过触发器数据，否则后续的执行都将出错
				}
				break;
			}
			// 内置动作 - 给变量设置一个随机值
			case ACTION_RANDOM_VARIABLE: {
				// 获得第一个参数的类型和参数值
				type = getShort();
				value = getShort();
				if (type == TYPE_VARIABLE) { // 第一个参数必须为变量类型
					s_vars[value] = Tools.random(getParameter(), getParameter());
				}
				else { // 如果第一个参数不是变量类型则不设置随机变量值，但需要跳过第二个参数
					skip(4); // 必须跳过触发器数据，否则后续的执行都将出错
				}
				break;
			}
			// 内置动作 - 计算变量值（4个参数，分别为变量、左值、运算符、右值）
			case ACTION_COMPUTE_VARIABLE: {
				// 获得第一个参数的类型和参数值
				type = getShort();
				value = getShort();
				if (type == TYPE_VARIABLE) { // 第一个参数必须为变量类型
					s_vars[value] = computeVariable(getParameter(), getParameter(),
							getParameter());
				}
				else {
					skip(6); // 必须跳过后面的3个参数
				}
				break;
			}
			// 内置动作 - 根据条件判断执行动作
			case ACTION_IF_THEN_ELSE: {
				getShort(); // 因为已经知道该动作第一个参数为条件，所以跳过条件类型
				cond = getCondition(); // 获得条件值
				int actionCount = 0;
				if (cond == true) { // 如果条件为真
					// 执行动作参数1
					getShort(); // 跳过动作类型
					actionCount = getShort(); // 获得动作列表数
					for (int i = 0; i < actionCount; i++) {
						getShort(); // 跳过动作数据大小
						value = getShort(); // 获得动作ID
						executeAction(value); // 通过递归调用来执行动作参数
					}
					skipAction(); // 跳过动作参数2
				}
				else { // 如果条件为假
					skipAction(); // 跳过动作参数1
					// 执行动作参数2
					getShort(); // 跳过动作类型
					actionCount = getShort(); // 获得动作列表数
					for (int i = 0; i < actionCount; i++) {
						getShort(); // 跳过动作数据大小
						value = getShort(); // 获得动作ID
						executeAction(value); // 通过递归调用来执行动作参数
					}
				}
				break;
			}
			// 内置动作 - 设置视口元件
			case ACTION_SET_VIEWACTOR: {
				value = getParameter();
				m_scene.setFocusActor(getActor(value));
				m_scene.m_smoothCamera = getParameter() == 0;
				break;
			}
			// 内置动作 - 设置玩家控制元件
			case ACTION_SET_PLAYERACTOR: {
				value = getParameter();
				Actor actor = (Actor) (m_scene.m_static_actors.elementAt(value));
				if (actor.isSelfActor()) {
					m_scene.m_controlledActor = GameManager.getInstance().m_role;
				}
				else if (actor instanceof AbstractGameActor) {
					m_scene.m_controlledActor = (AbstractGameActor) actor;
				}
				else {
					Tools.debugPrintln("GameScript Error! ActionID："
							+ ACTION_SET_PLAYERACTOR);
				}
				m_scene.setFocusActor(m_scene.m_controlledActor);
				break;
			}
			// 内置动作 - 设置场景中已有元件信息
			case ACTION_SET_ACTOR: {
				value = getParameter();
				m_scene.setActor(getActor(value), getParameter(), getParameter(),
						getParameter());
				break;
			}
			// 内置动作 - 让场景中的元件执行某个动作
			case ACTION_SET_ACTORACTION: {
				value = getParameter();
				Actor actor = getActor(value);
				actor.m_enabled = true;
				actor.m_visible = true;
				actor.setAction(getParameter(), false);
				break;
			}
			// 内置动作 - 获得场景中元件的动作ID
			case ACTION_GET_ACTORACTION: {
				getShort();
				value = getShort();
				int param = getParameter();
				s_vars[value] = getActor(param).m_actionIDNow;
				break;
			}
			// 内置动作 - 设置场景中元件的坐标
			case ACTION_SET_ACTORPOSITION: {
				value = getParameter();
				Actor actor = getActor(value);
				actor.m_prevPosX = actor.m_posX;
				actor.m_prevPosY = actor.m_posY;
				actor.m_posX = getParameter();
				actor.m_posY = getParameter();
				break;
			}
			// 内置动作 - 获得场景中元件的坐标
			case ACTION_GET_ACTORPOSITION: {
				getShort();
				type = getShort();
				getShort();
				value = getShort();
				int aId = getParameter();
				s_vars[type] = getActor(aId).m_posX;
				s_vars[value] = getActor(aId).m_posY;
				break;
			}
			// 内置动作 - 设置元件标记位状态
			case ACTION_SET_ACTORFLAG: {
				value = getParameter();
				getActor(value).setFlag(getParameter(),
						getParameter() == 0 ? false : true);
				break;
			}
			// 内置动作 - 获得元件标记位
			case ACTION_GET_ACTORFLAG: {
				getShort();
				value = getShort();
				s_vars[value] = getActor(getParameter()).getFlag(getParameter()) ? 1
						: 0;
				break;
			}
			// 内置动作 - 设置元件参数
			case ACTION_SET_ACTORPARAMETER: {
				getActor(getParameter()).setParameter(getParameter(),
						getParameter());
				break;
			}
			// 内置动作 - 获得元件参数值
			case ACTION_GET_ACTORPARAMETER: {
				getShort();
				value = getShort();
				s_vars[value] = getActor(getParameter()).getParameter(
						getParameter());
				break;
			}
			// 内置动作 - 设置元件的指定目的地
			case ACTION_SET_ACTORDEST: {
				value = getParameter();
				Actor actor = getActor(value);
				actor.m_destX = getParameter();
				actor.m_destY = getParameter();
				actor.m_velocity = getParameter() << Actor.ACTOR_FRACTION_BIT;
				if (actor.m_posX < actor.m_destX) {
					actor.m_vX = Math.abs(actor.m_velocity);
				}
				else {
					actor.m_vX = -(Math.abs(actor.m_velocity));
				}
				if (actor.m_posY < actor.m_destY) {
					actor.m_vY = Math.abs(actor.m_velocity);
				}
				else {
					actor.m_vY = -(Math.abs(actor.m_velocity));
				}
				break;
			}
			// 内置动作 - 移动元件到指定目的地
			case ACTION_MOVE_ACTOR: {
				value = getParameter();
				Actor actor = getActor(value);
				// actor.setFlag(Actor.ACTOR_FLAG_MOVING, true);
				actor.m_destX = getParameter();
				actor.m_destY = getParameter();
				actor.m_velocity = getParameter() << Actor.ACTOR_FRACTION_BIT;
				if (actor.m_posX < actor.m_destX) {
					actor.m_vX = Math.abs(actor.m_velocity);
				}
				else {
					actor.m_vX = -(Math.abs(actor.m_velocity));
				}
				if (actor.m_posY < actor.m_destY) {
					actor.m_vY = Math.abs(actor.m_velocity);
				}
				else {
					actor.m_vY = -(Math.abs(actor.m_velocity));
				}
				// m_scene.moveActorTo(m_scene.m_actors[value]);
				break;
			}
			// 移动视口
			case ACTION_MOVE_VIEW: {
				GameManager.getInstance().m_scene.moveCamera(getParameter(),
						getParameter(), getParameter());
				break;
			}
			// 内置动作 - 执行元件动作，动作执行完毕后触发器才继续执行
			case ACTION_PLAY_ACTORACTION: {
				value = getParameter();
				Actor actor = getActor(value);
				actor.m_enabled = true;
				actor.m_visible = true;
				actor.setAction(getParameter(), true);
				m_scene.playActorAction(actor);
				break;
			}
			// // 内置动作 - 添加指定元件类型的元件
			// case ACTION_ADD_ACTORBYID: {
			// value = getParameter();
			// Actor actor = getActor(value);
			// if (!actor.isSelfActor()) {
			// m_scene.addActor(actor, getParameter(), getParameter(),
			// getParameter());
			// }
			// break;
			// }
			// // 内置动作 - 添加指定元件类型的元件
			// case ACTION_ADD_ACTORBYCLASS: {
			// m_scene.addActor(m_scene.m_actors[getParameter()],
			// getParameter(), getParameter(),
			// getParameter());
			// break;
			// }
			// 内置动作 - 删除场景中的元件
			case ACTION_DELETE_ACTOR: {
				value = getParameter();
				Actor actor = getActor(value);
				actor.setEnabled(false);
				break;
			}
			// // 内置动作 - 获得场景中的空闲元件，根据元件ID
			// case ACTION_GET_ACTORBYID: {
			// getShort();
			// value = getShort();
			// Actor actor =
			// m_scene.getActor(m_scene.m_actors[getParameter()].m_animId,
			// true);
			// s_vars[value] = (actor == null ? -1 : actor.m_id);
			// break;
			// }
			// // 内置动作 - 获得场景中的空闲元件，根据元件定义
			// case ACTION_GET_ACTORBYCLASS: {
			// getShort();
			// value = getShort();
			// Actor actor = m_scene.getActor(getParameter(), true);
			// s_vars[value] = (actor == null ? -1 : actor.m_id);
			// break;
			// }
			// 内置动作 - 播放场景内过场动画
			case ACTION_PLAY_TRAILER: {
				runTrailer((getParameter() == 1), getParameter());
				break;
			}
			// // 内置动作 - 切换场景
			// case ACTION_SWITCH_SCENE: {
			// GameManager.getInstance().setSceneInfo(getParameter(),
			// getParameter(),
			// getParameter(), getParameter());
			// GameManager.getInstance().loadScene();
			// break;
			// }
			// 内置动作 - 显示对话框
			case ACTION_SHOW_DIALOG: {
				int face = getParameter();
				m_scene.draw(m_scene.m_screen.getGraphics());
				String text = m_scene.m_texts[getParameter()];
				m_scene.showDialog(face, 0, null, text);
				break;
			}
			// 内置动作 - 显示消息框
			case ACTION_SHOW_MESSAGE: {
				// m_scene.draw(m_scene.s_canvas.getGraphics());
				// value = getParameter();
				// UI.showMessage(m_scene.s_canvas.getGraphics(),
				// m_scene.m_texts[getParameter()],
				// value, UI.MSG_SCENE);
				break;
			}
			// 内置动作 - 在屏幕上写诗句
			case ACTION_SHOW_POEM: {
				Graphics g = m_scene.m_screen.getGraphics();
				m_scene.draw(g);
				value = getParameter();
				int w = Math.min(160, AbstractGameScreen.SCREEN_WIDTH);
				Font font = g.getFont();
				int fw = font.charWidth('一');
				int fh = font.getHeight();
				UIUtil.showPoem(m_scene, g,
						m_scene.m_texts[getParameter()],
						100, value, (m_scene.m_cameraW - w) / 2,
						(m_scene.m_cameraH - w) / 2, w, w, fw, fh);
				break;
			}
			// // 显示字幕
			// case ACTION_SHOW_SUBTITLE: {
			// String str = m_scene.m_texts[getParameter()];
			// int y = getParameter();
			// int h = getParameter();
			// int speed = getParameter();
			// //
			// int w = Math.min(160, AbstractGameScreen.SCREEN_WIDTH);
			// break;
			// }
			// // 内置动作 - 在屏幕中间显示头像，同时闪过一道红光
			// case ACTION_SHOW_FACE: {
			// m_scene.showFace(getParameter(), // 头像ACTOR ID
			// getParameter(), // 表情ID
			// getParameter(), // 头像高度
			// getParameter(), // 速度
			// getParameter(), // 加速度
			// getParameter(), // 速度上限
			// getParameter(), // 停留位置
			// getParameter(), // 停留帧数
			// getBooleanParam()); // 反向移动
			// break;
			// }
			// 内置动作 - 屏幕闪屏效果
			case ACTION_FLASH_SCREEN: {
				m_scene.flashScreen(getParameter(), getParameter());
				break;
			}
			// 内置动作 - 屏幕渐显
			case ACTION_SCREEN_FADEIN:
				// 内置动作 - 屏幕渐隐
			case ACTION_SCREEN_FADEOUT: {
				m_scene.screenFade(actionId == ACTION_SCREEN_FADEIN, getParameter());
				break;
			}
			// 内置动作 - 屏幕震动效果
			case ACTION_SCREEN_SHAKE: {
				m_scene.m_screen.setShake(getParameter(), 0, 4);
				break;
			}
			// 内置动作 - 设置特效开启/关闭（黑屏、天气等等）
			case ACTION_SET_EFFECT_ON:
			case ACTION_SET_EFFECT_OFF: {
				value = getParameter();
				if (actionId == ACTION_SET_EFFECT_ON) {
					m_scene.m_effectId |= (1 << value);
					m_scene.m_effectOn = true;
					m_scene.draw(m_scene.m_screen.getGraphics());
					m_scene.m_screen.flush();
					GameManager.waitAnyTime(50);
				}
				else {
					m_scene.m_effectId &= ~(1 << value);
					if (m_scene.m_effectId == 0) {
						m_scene.m_effectOn = false;
					}
				}
				break;
			}
			// 内置动作 - 跳出触发器执行
			case ACTION_BREAK_TRIGGER: {
				getParameter(); // 跳过预留参数，目前该参数没有用
				m_triggerEnd = true;
				break;
			}
			// // 内置动作 - 显示选择框（变量、头像、表情、正文、选择项）
			// case ACTION_SHOW_SELECTOR: {
			// // 获得第一个参数的类型和参数值
			// type = getShort();
			// value = getShort();
			// if (type == TYPE_VARIABLE) { // 第一个参数必须为变量类型
			// skip(2);
			// getParameter(); // biaoqing
			// m_scene.draw(m_scene.s_canvas.getGraphics());
			// s_vars[value] =
			// UI.showSelector(m_scene.s_canvas.getGraphics(),
			// m_scene.m_texts[getParameter()],
			// Tools.splitString(
			// m_scene.m_texts[getParameter()], m_scene.s_canvas.s_font,
			// '|',
			// AbstractGameScreen.SCREEN_WIDTH), false, false);
			// }
			// else {
			// skip(6); // 必须跳过后面的3个参数
			// }
			// break;
			// }
			// // 内置动作 - 显示确认框（变量、正文），确认框只有确定和取消两种选择
			// case ACTION_SHOW_CONFIRM: {
			// // 获得第一个参数的类型和参数值
			// type = getShort();
			// value = getShort();
			// if (type == TYPE_VARIABLE) { // 第一个参数必须为变量类型
			// s_vars[value] =
			// UI.showConfirm(m_scene.s_canvas.getGraphics(),
			// m_scene.m_texts[getParameter()]) ? 1 : 0;
			// }
			// else {
			// skip(2); // 必须跳过后面的1个参数
			// }
			// break;
			// }
			// 内置动作 - 声音设置
			case ACTION_SET_SOUND: {
				break;
			}
			// 内置动作 - 播放声音
			case ACTION_PLAY_SOUND: {
				int id = getParameter();
				int loop = getParameter();
				if (Music.getInstance().isSoundOn()) {
					// 播放声音
					Music.getInstance()
							.loadBackground(Music.SOUND_BG_FILE_NAME, id);
					Music.getInstance().getBackground().setLoop(loop == 0 ? -1 : 1);
					Music.getInstance().playBackground();
				}
				else {
					// 不播放声音，但是需要记录当前应该播放的声音id
					Music.getInstance().setCurBackGroundId(id);
				}
				break;
			}
			case ACTION_SET_POSITION:
				GameManager.getInstance().m_game_message.sendSetPosition(getParameter(), getParameter());
				break;
			case ACTION_SWITCH_SCENE:
				GameManager.getInstance().m_game_message.sendSwitchScene(m_scene.m_texts[getParameter()], getParameter(), getParameter());
				break;
			case ACTION_SHOW_INTERACT_DIALOG:
				String content = m_scene.m_texts[getParameter()];
				m_scene.showInteractDialog(content);
				break;
		}
	}

	// // ACTION相关
	// //////////////////////////////////////////////////////////////////////////

	public Actor getActor(int id)
	{
		Actor actor = (Actor) (m_scene.m_static_actors.elementAt(id));
		if (actor.isSelfActor()) {
			return m_scene.m_controlledActor;
		}
		else {
			return actor;
		}
	}
}
